// tspcluster - Traveling Salesman Problem
// Copyright (C) 2006  Frederik Carlier
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA

using System;
using System.IO;

namespace UGent.Tsp
{
	public class SimulatedAnnealing
	{	
		public SimulatedAnnealing(MarkovCluster cluster)
		{
		    this.cluster = cluster;
		}
		
		MarkovCluster cluster;
		double beta = 0;
		
		public void Run()
		{
		    while(true)
		    {
		        Console.WriteLine("Value of beta: {0}", beta);
		        
		        cluster.SetBeta(beta);
		        cluster.SetAlgorithmType(AlgorithmType.Metropolis);
		        cluster.Start();
		        cluster.WaitForAll();
		        
		        Results results = cluster.GetResults();
		        Distribution histogram = results.Transitions.GetDistribution(DistributionEstimator.Histogram, false);
                
	                // Write out a bunch of less or more interesting things.
        	        string fileName = string.Format("beta-{0}-histogram.txt", beta);
        	        if(File.Exists(fileName))
        	            File.Delete(fileName);
        	        
               		using(FileStream stream = File.OpenWrite(fileName))
                	{
                    		histogram.WriteToStream(stream);
                	}
                
		        beta += 10;
		    }
		}
		
		public static void RunOnConsole()
		{
		    MarkovCluster cluster = new MarkovCluster();
		    cluster.ConfigureOnConsole();
		    cluster.ConfigureSimulationOnConsole();

		    SimulatedAnnealing annealing = new SimulatedAnnealing(cluster);
		    annealing.Run();
		}
	}
}
